因为LINUX操作系统的流行,Linus 已经成为地球人都知道的名人。虽然大家可能都听过钱钟书先生的名言:“假如你吃个鸡蛋觉得味道不错,又何必认识那个下蛋的母鸡呢?” 但是如果真是遇到一个“特别显赫”的鸡蛋,很多人还是想看看能生出这颗神蛋的母鸡的,或者想听听这只母鸡的故事。
其实,在Linux内核的代码里,就隐藏着关于Linus大神的一个美妙故事。
启动Linux系统,Ctrl + Alt + T打开一个终端窗口,执行如下命令,唤出GDB,并打开描述内核空间的kcore虚拟文件。
$ sudo gdb --core /proc/kcore
然后在GDB中执行如下命令加载内核的符号信息:
(gdb)file /home/ge/work/linux-3.12.2/vmlinux
再切换为INTEL风格的反汇编:
(gdb) set disassembly-flavor intel
接下来反汇编用于系统重启的SYSC_reboot内核函数:
(gdb)disassemble SYSC_reboot
结果类似下图所示。
对于看到汇编就晕的看官勿要急(^_^),其实x86汇编是非常简单易懂的,特别是这个函数很好理解,里面充满着故事。另外,这可是地地道道Linus大神所写的代码啊。
在这个函数里有一串比较指令,有理且有趣。不妨先看这一句:
cmp DWORD PTR [ebp-0x114],0xfee1dead
这个常量很酷吧?Feel Dead。Linus大神是著名的语言大师,常常语出惊人,用非常简短的语言说出人间真善美,说出他人所不敢说。因为这个函数是用来重启的,如果不feel dead,干嘛要重启呢?
再往下看,会看到这样一条比较指令:
cmp edi,0x28121969
这个常量是不也很特别,0x28121969,是不很像是日期,对的,这就是Linus大神的出生年月日,1969年12月28日。明年,Linus大神50岁了,时光如流水啊,当年的毛头小伙,就要50岁了。三十而立,四十不惑,五十而知天命。Linus大神显然提前完成了“知天命”的目标。他就是上天派下来革Windows的命的。(^_^)
再往下看,还有一个日期:
cmp edi,0x5121996
1996年12月5日,这个日期是什么呢?是Linus大女儿的生日。
把时光倒退回1993年,那时Linus还是24岁的棒小伙,应该是大学毕业不久吧,当时知道Linux的还不多。有一天,Linus亲自授课,宣传Linux的用法。课程结束时,Linus留了一个课后测验,要求参加者做好了以邮件形式交卷。结果,有一位上课的美女在交测验结果的同时向Linus发出了一个约会的邀请,于是一场培训成就了一段美妙的姻缘,这个女生(Tove)成了Linus的太太。值得一提的是,Linus太太武功高强,曾经6次夺得芬兰国家级别的跆拳道比赛冠军。
1997年6月,第二届亚特兰大Linux展示会(Atalanta Linux Showcase,简称ALS)在美国举行,这是Linux发展早期的一个年度盛会。在周五晚上的感谢晚宴上,Linus全家出席,在会议的相册中,可以看到幸福的一家人。
(照片来自http://linuxshowcase.org)
照片中,Tove深情地看着Linus。Linus抱着的就是他们的大女儿,名叫Patricia Torvalds。Linus把她称作Linus v2.0。在位于母校网站的一个个人主页上(https://www.cs.helsinki.fi/u/torvalds/),Linus放了几张Patricia婴儿时的照片,至今仍在,好久没有更新了。从网页上的信箱([email protected])来看,当时Linus还没有全职做Linux,还在Transmeta公司工作。
2015年8月,opensource.com特别采访了已经在读大学的Patricia。
https://opensource.com/life/15/8/patricia-torvalds-interview
报道提到,Patricia热爱计算机科学,已经在多个IT公司实习,技术方面小有成就,大有子承父业的雄心壮志。
(照片来自opensource.com)
照片中站在中间便是Patricia,她旁边的另两个年轻女生是她的两个妹妹,她们的生日也可以在上面的汇编代码里找到:
cmp edi,0x16041998
cmp edi,0x20112000
一位是98年,一位是00后。
那么这些神秘的常量是如何用的呢?这要看一下reboot API的函数原型。
int reboot(int magic, int magic2, int cmd, void *arg);
在这个API的文档中(man reboot(2)),可以看到关于上述常量的说明:
This system call will fail (with EINVAL) unless magic equals LINUX_REBOOT_MAGIC1 (that is, 0xfee1dead) and magic2 equals LINUX_REBOOT_MAGIC2 (that is, 672274793). However, since 2.1.17 also LINUX_REBOOT_MAGIC2A (that is, 85072278) and since 2.1.97 also
LINUX_REBOOT_MAGIC2B (that is, 369367448) and since 2.5.71 also LINUX_REBOOT_MAGIC2C (that is, 537993216) are permitted as value for magic2. (The hexadecimal values of these constants are meaningful.)
括号里的一句说这些常量的十六进制是富有含义的,诚然。
换句话来说,要想成功调用reboot API,那么前两个参数必须严格按如下规则填写:
第一个参数必须是0xfee1dead。
在Linus大神的大女儿Patricia出生之前,第二个参数能且只能是0x28121969,也就是大神的生日。
当Linus有了大女儿Patricia后,第二个参数也可以是Patricia的生日0x5121996。这样说有点不精确,精确的说法是从Linux内核2.1.17版本开始,第二个参数也可以是0x5121996。查阅kernel.org上的内核发布历史,2.1.17应该发布于1996年12月22日。可以想见,Linus大神在喜得爱女的几天内就修改了内核代码,然后在女儿满月之前把把这个代码发布给世界了。
当Linus有二女儿后,第二个参数也可以是二女儿的生日。
当Linus有了小女儿后,第二个参数也可以是小女儿的生日。
在内核代码中,上述规则是在reboot.c中强制的,代码如下:
/* For safety, we require "magic" arguments. */
if (magic1 != LINUX_REBOOT_MAGIC1 ||
(magic2 != LINUX_REBOOT_MAGIC2 &&
magic2 != LINUX_REBOOT_MAGIC2A &&
magic2 != LINUX_REBOOT_MAGIC2B &&
magic2 != LINUX_REBOOT_MAGIC2C))
return -EINVAL;
这个for safety,有点含糊啊!哈哈。
因为应用程序调用这个系统服务的时候必须使用这一系列常量,因为它们的定义写在uapi目录下的reboot.h,即:
/*
* Magic values required to use _reboot() system call.
*/
#defineLINUX_REBOOT_MAGIC10xfee1dead
#defineLINUX_REBOOT_MAGIC2672274793
#defineLINUX_REBOOT_MAGIC2A85072278
#defineLINUX_REBOOT_MAGIC2B369367448
#defineLINUX_REBOOT_MAGIC2C537993216
注意啊,在这个文件和文档中,代表生日的四个常量都是以十进制表达的,应该是为了隐藏一下秘密吧。
0:000> .formats 0n85072278
Evaluate expression:
Hex: 00000000`05121996
如此看来,Linus大神不仅把这些常量写在Linux内核代码中,而且使它们成为Linux API的一部分。这意味着,这将成为永远。只要Linux系统还在,那么这些常量就将永远使用,因为API意味着用户态和内核态的法定接口。为了保障应用程序的兼容性,不可轻易变化。
无论哪种文化,家庭都有着极其重要的地位。修身齐家治国平天下,欲治其国者,先齐其家。从上面的故事来看,Linus大神是个很爱家的男人。他把自己心爱的家庭成员生日铭记(雕刻)在了他的伟大作品之中。
那么,Linus大神为什么选择reboot系统调用呢?reboot代表着新的开始,代表不拘泥于现状,从新出发,从头再来。这是很多人都喜欢的人生哲学。在古老的易经中,第63卦是既济,字面意思是渡河成功,代表成就了一个目标。但这并不是终结,最后一卦(第64卦)是未济,代表还有新的目标没有达到,需要继续努力。
某种程度上来说,人生应该在实现一个个“既济”的成果之后,不断地向着“未济”的目标进军。这也意味着人生要不断学习,用《荀子》一书开篇的话来说就是“学不可以已(停止)”。
这篇短文是带着对Linus大神的敬意来写的,希望大家受到鼓舞,学习Linus爱家爱代码的敬业精神,不要误以为老雷在亵渎圣贤啊。
原文标题:雕刻在LINUX内核中的LINUS故事
文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。
收藏
人收藏
扫一扫,分享给好友
复制链接分享
评论
发布评论请先 登录
相关推荐
Hi3861开发板串口看不到命令行是为什么?
1)开发板启动,只有教程中的AT命令能使用,敲回车报ERROR;
2)开发板没有linux常用命令吗(ls、pwd、cd)?还...
发表于 03-17 15:41 •
275次
阅读
介绍assert的使用方法
很多业务场景需要我们某一特定的时刻去做某件任务,定时任务解决的就是这种业务场景。一般来说,系统可以使....
Linux爱好者 发表于 03-17 14:06 •
123次
阅读
如何使用 Compose 进行构建
适用于 Wear OS 的 Compose 已推出了开发者预览版,使用 Compose 构建 Wea....
谷歌开发者 发表于 03-17 13:44 •
155次
阅读
CFI的基本概念
控制流劫持是一种危害性极大的攻击方式,攻击者能够通过它来获取目标机器的控制权,甚至进行提权操作,对目....
Linux阅码场 发表于 03-17 13:36 •
104次
阅读
OpenHarmony应用开发为什么不首选C/C++作为应用开发语言呢
OpenHarmony本来就是C和C++开发的,支持C/C++语言环境。应用开发为什么不首选C/C++作为应用开发语言。
1、相对于其他开...
发表于 03-17 10:30 •
797次
阅读
i.MX6ULL嵌入式Linux开发6-系统烧写到eMMC
本篇主要介绍了Linux移植的系统打包烧录的EMMC的方法,使用MfgTool工具,将**uboot....
码农爱学习 发表于 03-17 09:17 •
508次
阅读
致远微电子首款多媒体控制和图像显示应用的高集成度芯片
致远微电子推出的首款多媒体控制和图像显示应用的高集成度芯片,采用ARM9内核架构,具备MPU基础功能....
ZLG致远电子 发表于 03-17 08:08 •
163次
阅读
在CPU上如何同时尝试 getrandom
Jason Donenfeld 是 WireGuard 的主要开发者,同时他也是 Linux 内核随....
Linux爱好者 发表于 03-16 17:19 •
514次
阅读
基础算法:差分数组详解
前文说前缀和主要适用的场景是原始数组不会被修改的情况下,频繁查询某个区间的累加和。
算法与数据结构 发表于 03-16 15:57 •
394次
阅读
如何用 Markdown 来做 PPT
相信绝大多数朋友做 PPT(幻灯片 / Slides / Deck 等各种称呼了)都是用的 Powe....
数据分析与开发 发表于 03-16 14:10 •
100次
阅读
关于指数对比度增强FPGA实现
对比度增强是个广泛的话题,前文中关于直方图均衡的方法,其实就是一种对比度增强。而对比度增强,就是提高....
FPGA技术江湖 发表于 03-16 11:46 •
108次
阅读
一文深入理解操作系统的进程调度
想深入理解操作系统的进程调度,需要先获得一些准备知识,这样后面就不懵圈啦:
Linux爱好者 发表于 03-16 10:58 •
103次
阅读
如何编译已有的C++去生成可在OpenHarmony系统使用的动态库文件呢
原有Linux环境下的C++ 项目,可通过在CMakeList文件中设置使用的工具链,编译出各平台开发板上可使用的so文件。
请问,我现...
发表于 03-16 10:42 •
477次
阅读
rt-thread的信号回调函数对内核有何影响呢
前言
信号 signal,并不是线程间同步的信号量 semaphore。后者是线程间同步机制的一种,而前者是线程间异步通信的一种。
官方文...
发表于 03-16 10:14 •
324次
阅读
如何鉴别Linux服务器是否被入侵
随着开源产品的越来越盛行,作为一个Linux运维工程师,能够清晰地鉴别异常机器是否已经被入侵了显得至....
马哥Linux运维 发表于 03-16 10:08 •
137次
阅读
Linux namespace和cgroups简介
先放结论,namespace 是用来做资源隔离, cgroup 是用来做资源限制。
马哥Linux运维 发表于 03-16 09:03 •
137次
阅读
解析数据结构的常用七大排序算法
为了让大家掌握多种排序方法的基本思想,本篇文章带着大家对数据结构的常用七大算法进行分析:包括直接插入....
C语言编程学习基地 发表于 03-16 08:22 •
82次
阅读
从C 到 matlab 到 FPGA,如何实现CNN的项目
经过了前面的开胃菜,项目正式开始。一步步讲解这个模型怎么玩起来的。从C 到 matlab 到 FPG....
FPGA攻城狮之家 发表于 03-15 17:13 •
607次
阅读
润和鸿蒙系列开发板资料总结(原理图+源代码+教程)
1、润和 HH-SCDAYU200 鸿蒙开发套件
简介:基于Rockchip RK3568,集成双核心架构GPU以及高效能NPU;板载四核6...
发表于 03-15 16:40 •
3394次
阅读
HDF驱动框架设计汇总分享
什么是驱动开发?
这个看似不是问题的问题却很重要,我们必须需要从这一步开始理清楚,见下图:
HDF 驱动框架探路(一):
...
发表于 03-15 15:31 •
856次
阅读
使用Trace View对对Kernel进行性能仿真分析
对Kernel进行性能分析需要对其进行仿真,同时还要用到Vitis Analyzer。为便于说明,我....
TeacherGaoFPGAHub 发表于 03-15 15:30 •
177次
阅读
怎样去处理OpenHarmony执行hb命令报错的问题呢
在执行hb命令的时候报错:
重新安装环境,在安装hb的时候出现下面的问题警告:
处理方式:在openharmony 代码根目录下使用...
发表于 03-15 14:33 •
343次
阅读
assign组合逻辑和always@(*)组合逻辑的区别
1.always@后面内容是敏感变量,always@(*)里面的敏感变量为*,意思是说敏感变量由综合....
FPGA之家 发表于 03-15 14:08 •
158次
阅读
基础的Linux操作命令
IC设计是在linux环境下,很多操作需要在Terminal中进行,因此想要学习IC设计,就必须先需....
FPGA之家 发表于 03-15 13:42 •
101次
阅读
Verilog系统函数和边沿检测
“ 本文主要分享了在Verilog设计过程中一些经验与知识点,主要包括Verilog仿真时常用的系统....
FPGA之家 发表于 03-15 13:34 •
87次
阅读
gpio和pinctrl子系统的关系与区别
gpio 和 pinctrl 子系统在内核里的使用率非常高,和嵌入式产品的关联非常大。从这两个子系统....
FPGA之家 发表于 03-15 11:40 •
159次
阅读
RT-Thread内核学习资料汇总
1、RT-Thread内核对象管理
对象就像一本本书,如何查找呢?查找对比对象里的成员属性【name】:名字。 对象名称长度可...
发表于 03-15 10:45 •
440次
阅读
什么是“三字母词”
在ANSI标准中,定义了“三字母词”,或者成为“三联符序列”,英文为"trigraph sequen....
STM32嵌入式开发 发表于 03-15 09:27 •
73次
阅读
BPF系统调用与Tracing类型的BPF程序
既然是提供向内核注入代码的技术,那么安全问题肯定是重中之重。平时防范他人通过漏洞向内核中注入代码,这....
Linux阅码场 发表于 03-14 16:42 •
263次
阅读
盘点5款值得收藏的Linux开发板
最近股市又哀鸿遍野……于是,那句 “树莓派是最好的理财产品”又开始在我耳边萦绕。“缺芯”笼罩之下,开....
话说科技 发表于 03-14 15:12 •
247次
阅读
霍尼韦尔智能楼宇技术助力小镇建设_ADI为Linux发行版扩充1000多个器件驱动
2022年2月11日,中国北京——霍尼韦尔宣布与中建二局安装工程有限公司和北京市设备安装工程集团有....
电子魔法师 发表于 03-14 15:04 •
549次
阅读
一种简单的OpenHarmony环境搭建方法
本文介绍一种简单的OpenHarmony环境搭建方法。
HarmonyOS官方合作社区 发表于 03-14 13:58 •
1289次
阅读
一种软件模拟内核复位的方法
说到复位,我们都不会陌生,对于一个MCU系统,复位电路是必不可少的一部分。复位的种类有很多:上电复位....
中颖电子 发表于 03-14 12:04 •
177次
阅读
i.MX6ULL嵌入式Linux开发5-根文件系统完善
上篇文章,使用BusyBox构建了基础的嵌入式Linux系统的根文件系统,基本的功能可以正常运行,但....
码农爱学习 发表于 03-14 08:44 •
141次
阅读
i.MX6ULL嵌入式Linux开发4-根文件系统构建
本篇使用BusyBox来构建根文件系统,并通过NFS网络调试的方式实现根文件系统挂载测试,实测时解决....
码农爱学习 发表于 03-14 08:41 •
158次
阅读
i.MX6ULL嵌入式Linux开发3-Kernel移植
本文进行Linux内核的移植。
码农爱学习 发表于 03-14 08:36 •
156次
阅读
如何快速学习并精通C语言
学习C语言不是一朝一夕的事情,但也不需要花费十年时间才能精通。如何以最小的代价学习并精通C语言是本文....
嵌入式ARM 发表于 03-12 11:59 •
370次
阅读
有没有能用在51单片机平台上的语音芯片?
最近看了一下云知声的蜂鸟M系列的离线语音,但是研究了半天不知道能不能移植到51单片机的平台上(就是通过串口通讯),后来又看...
发表于 03-11 17:08 •
1230次
阅读
有谁知道HarmonyOS内核最重要的结构体是什么呢
答案一定是: LOS_DL_LIST(双向链表),它长这样.typedef struct LOS_DL_LIST {//双向链表,内核最重要结构体&nb...
发表于 03-11 15:09 •
952次
阅读
提高Linux服务器性能的20个技巧
Linux功能丰富、强大、灵活,你可以用它完成各种任务,在这篇文章中,我们将讨论一些提高Linux....
Linux爱好者 发表于 03-11 10:14 •
159次
阅读
代码和bug就是一个此消彼长、相互依赖的过程
经常听一些朋友说道:"你写的代码没有bug,那你离丢饭碗不远了",又或者代码中故意保留一些bug来增....
硬件攻城狮 发表于 03-11 10:01 •
137次
阅读
51点灯与Linux驱动点灯的区别
嵌入式初学者入门的第一个“项目”就是LED点灯,那么,本文带你看看51、STM32、Linux点灯有....
strongerHuang 发表于 03-10 17:37 •
1358次
阅读
如何实现软硬件分层
以STM32为例,打开网络上下载的例程或者是购买开发板自带的例程,都会发现应用层中会有stm32f1....
strongerHuang 发表于 03-10 17:32 •
488次
阅读
为VisionFive星光板上创建Debian系统镜像
在RISC-V 星光板VisionFive上创建Debian/Linux系统
发表于 03-09 20:52 •
10次
阅读
如何快速排查IO异常输出问题
在嵌入式开发过程中,IO 操作是不可避免的,很多时候 IO 操作很正常,但有些时候可能因为某些原因导....
strongerHuang 发表于 03-09 17:55 •
711次
阅读
C/C++在线编译器的功能
作为程序员,使用编译器是必备技能,但是从入门到放弃,基本上就是在开发环境安装、配置这一步。。。
strongerHuang 发表于 03-09 17:52 •
2556次
阅读
有效提高编译速度的方法
今天就来说说嵌入式软件开发中,常见的提高编译速度的一些操作或者方法。
strongerHuang 发表于 03-09 17:31 •
662次
阅读
Linux内核代码修改将为性能测试获8450%提升
Jason Donenfeld 是 WireGuard 的主要开发者,同时他也是 Linux 内核随....
马哥Linux运维 发表于 03-09 14:16 •
211次
阅读
采用FMDft61t133芯片点亮LED的代码
由于目前本人零时朝8bit单片机方向走所以其内容接下来也是8bit单片机。
互联网电子设计 发表于 03-09 09:19 •
1550次
阅读
乘数智之风,超越单一视角 为世界造舟筏 女性在当下如何创造?
随着女性意识、女性购买力的不断上升,女性营销也以燎原之势在各大品牌中流行开来。三八节还没到,就有不少....
脑极体 发表于 03-09 09:16 •
759次
阅读
python私有变量和私有方法
python私有变量和私有方法 1. 下划线妙用 在 Python 中,下划线可是非常推荐使用的符号....
python爬虫知识分享 发表于 03-08 16:30 •
412次
阅读
浅谈MCU内核架构发展历史
电子发烧友网报道(文/程文智、李宁远)目前,MCU已经渗透到我们生活的各个领域,几乎很难找到有哪个领....
电子发烧友网 发表于 03-08 10:28 •
384次
阅读
《Linux命令行大全》(英文版)
[美]William E. Shotts Jr. 著
发表于 03-07 16:29 •
19次
阅读
i.MX6ULL嵌入式Linux开发2-uboot移植实践
上篇文章,我们介绍了如何使用NXP原厂的uboot进行编译和烧写,将uboot运行在自己的开发板上。....
码农爱学习 发表于 03-07 09:00 •
1659次
阅读
i.MX6ULL嵌入式Linux开发1-uboot移植初探
本系列教程以i.MX6ULL处理器的ARM开发板为实验基础,学习记录嵌入式Linux开发的各种知识与....
码农爱学习 发表于 03-07 08:57 •
1188次
阅读
无代码数字中台能否成为替代OA的存在
英国政治家切斯特菲尔德说过:“效率是做好工作的灵魂。”我想各行各业的管理者应该都体会颇深,不管是行业....
发表于 03-04 10:06 •
14次
阅读
万象奥科RZ G2L核心板高低温测试
评估测试RZ/G2L核心板环境适应性,测试低温启动、高温工作、高低温循环状态下的工作情况。
武汉万象奥科 发表于 03-03 15:27 •
10次
阅读
RZ G2L核心板以太网接口性能测试
武汉万象奥科RZ/G2L核心板支持2路千兆以太网接口,评估测试RZ/G2L双网口实际传输速率。
武汉万象奥科 发表于 03-03 14:04 •
10次
阅读
如何较为高效地完成多语言跨平台测试
针对软件静态测试,ISO26262标准的Part 6部分给出了具体要求说明,随着各大整车厂和供应商静....
经纬恒润 发表于 03-03 12:39 •
375次
阅读
AM4379 AM437x ARM Cortex-A9 微处理器 (MPU)
TI AM437x高性能处理器基于ARM Cortex-A9内核。
这些处理器通过3D图形加速得到增强,可实现丰富的图形用户界面,还配备了协处理器,用于进行确定性实时处理(包括EtherCAT,PROFIBUS,EnDat等工业通信协议)。该器件支持高级操作系统(HLOS)。基于Linux的® 可从TI免费获取。其它HLOS可从TI的设计网络和生态系统合作伙伴处获取。
这些器件支持对采用较低性能ARM内核的系统升级,并提供更新外设,包括QSPI-NOR和LPDDR2等存储器选项。
这些处理器包含功能方框图中显示的子系统,并且后跟相应的“说明”中添加了更多信息说明。
处理器子系统基于ARM Cortex-A9内核,PowerVR SGX™图形加速器子系统提供3D图形加速功能以支持显示和高级用户界面。
可编程实时单元子系统和工业通信子系统(PRU-ICSS与ARM内核分离,允许单独操作和计时,以实现更高的效率和灵活性.PRU-ICSS支持更多外设接口和EtherCAT,PROFINET,EtherNet /IP,PROFIBUS,以太网Powerlink,Sercos,EnDat等...
发表于 09-25 11:51 •
532次
阅读
|